package LeetCode75;

/**
 * 1456. 定长子串中元音的最大数目
 * 给你字符串 s 和整数 k 。
 *
 * 请返回字符串 s 中长度为 k 的单个子字符串中可能包含的最大元音字母数。
 *
 * 英文中的 元音字母 为（a, e, i, o, u）。
 *
 *
 *
 * 示例 1：
 *
 * 输入：s = "abciiidef", k = 3
 * 输出：3
 * 解释：子字符串 "iii" 包含 3 个元音字母。
 * 示例 2：
 *
 * 输入：s = "aeiou", k = 2
 * 输出：2
 * 解释：任意长度为 2 的子字符串都包含 2 个元音字母。
 * 示例 3：
 *
 * 输入：s = "leetcode", k = 3
 * 输出：2
 * 解释："lee"、"eet" 和 "ode" 都包含 2 个元音字母。
 * 示例 4：
 *
 * 输入：s = "rhythms", k = 4
 * 输出：0
 * 解释：字符串 s 中不含任何元音字母。
 * 示例 5：
 *
 * 输入：s = "tryhard", k = 4
 * 输出：1
 *
 *
 * 提示：
 *
 * 1 <= s.length <= 10^5
 * s 由小写英文字母组成
 * 1 <= k <= s.length
 */
public class T1456_定长字符串中元音的最大数目 {
    //开辟一个新数组 将元音字符设置为1 非元音字符设置为0 就可以利用前缀和 计算定长子数组中的元音数量
    public int maxVowels(String s, int k) {

        int[] preSumArray = new int[s.length() + 1];
        preSumArray[0] = 0;

        int[] ints = new int[s.length()];

        //将字符串转为只有0和1的数组
        for (int i = 0; i < s.length(); i++) {
            //该字符是元音 置为1
            if (s.charAt(i) == 'a' || s.charAt(i) == 'e' || s.charAt(i) == 'i' || s.charAt(i) == 'o' || s.charAt(i) == 'u') {
                ints[i] = 1;
            } else {
                ints[i] = 0;
            }
        }

        //计算前缀和
        int sum = 0;
        for (int i = 0; i < ints.length; i++) {
            sum += ints[i];
            preSumArray[i + 1] = sum;
        }

        //区间计算最大值
        int max = 0;
        for (int i = k; i < preSumArray.length; i++) {
            max = Math.max(max, preSumArray[i] - preSumArray[i - k]);
        }

        return max;
    }
}

